﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Configuration;
using System.IO;
using System.Data;

namespace Aga.Informatizacion.RenameImages
{
    class Program
    {
        static void Main(string[] args)
        {
            string docsFolder = ConfigurationManager.AppSettings["DocsFolder"];

            List<Imagen> images = new List<Imagen>();

            if (!Directory.Exists(docsFolder))
            {
                Console.WriteLine("No se encontró el directorio " + docsFolder);
                return;
            }

            SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["AGAPSAD"].ConnectionString);

            SqlCommand select = conn.CreateCommand();

            select.CommandType = System.Data.CommandType.Text;
            select.CommandText = "SELECT Id, DocumentoId, Nombre FROM imagenes";

            conn.Open();

            SqlDataReader reader = select.ExecuteReader();

            while (reader.Read())
            {
                images.Add(new Imagen
                {
                    Id = reader.GetInt32(0),
                    DocId = reader.GetInt32(1),
                    Name = reader.GetString(2)
                });
            }

            conn.Close();

            foreach (var image in images)
            {
                if (!image.Name.StartsWith(image.DocId.ToString() + "_"))
                {
                    image.NewName = image.DocId.ToString() + "_" + image.Name;

                    string source = Path.Combine(docsFolder, image.Name);
                    string destination = Path.Combine(docsFolder, image.NewName);

                    try
                    {
                        RenameImage(source, destination);

                        try
                        {
                            string updateText = String.Format("UPDATE Imagenes SET Nombre = '{0}' WHERE Id = {1}", image.NewName, image.Id);

                            SqlCommand update = conn.CreateCommand();
                            update.CommandType = System.Data.CommandType.Text;
                            update.CommandText = updateText;

                            conn.Open();
                            update.ExecuteNonQuery();
                            conn.Close();

                            Console.WriteLine(String.Format("Se renombró la imagen '{0}' por '{1}'", image.Name, image.NewName));

                        }
                        catch (Exception ex)
                        {
                            if (conn.State == ConnectionState.Open)
                                conn.Close();

                            File.Move(destination, source);

                            Console.WriteLine(String.Format("No se pudo renombrar la imagen '{0}' por '{1}'", image.Name, image.NewName));
                            Console.WriteLine(ex.Message);
                            break;
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(String.Format("No se pudo renombrar la imagen '{0}' por '{1}'", image.Name, image.NewName));
                        Console.WriteLine(ex.Message);
                        break;
                    }
                }
                else
                {
                    Console.WriteLine(String.Format("No se renombrará la imagen '{0}'", image.Name));
                }
            }

            conn.Close();


            Console.WriteLine("\nPresione cualquier tecla para finalizar.");

            Console.ReadKey();

        }

        private static bool RenameImage(string source, string destination)
        {
            if (File.Exists(source) && !File.Exists(destination))
            {
                File.Move(source, destination);
                return true;
            }
            else
            {
                if (!File.Exists(destination))
                {
                    Console.WriteLine(String.Format("No se encontró el archivo '{0}'.", source));
                    return false;
                }

                return true;
            }
        }
    }

    public class Imagen
    {
        public int Id { get; set; }
        public int DocId { get; set; }
        public string Name { get; set; }
        public string NewName { get; set; }
    }
}
